#pragma once
#ifndef __HUFFMAN_H__
#define __HUFFMAN_H__

#include "../queue/queue.h"
#include <stdlib.h>
#include <string.h>

/* 霍夫曼树的节点结构 huffman tree node*/
typedef struct _htNode
{
    char symbol;            // 字符符号
    struct _htNode *lchild; // 左子树
    struct _htNode *rchild; // 右子树
} htNode;

/* 霍夫曼树的根节点结构 */
typedef struct _htTree
{
    htNode *root;
} htTree;

/* 霍夫曼编码链表节点的结构 */
typedef struct _hlNode
{
    char symbol;          // 字符
    char *code;           // 存放字符的编码 -- 对应编码的字符串表现形式
    struct _hlNode *next; //指向后续节点，形成链表的形式
} hlNode;

/* 霍夫曼编码链表结构，存放各个字符的编码 */
typedef struct _hlTable
{
    hlNode *first; // 第一个节点
    hlNode *last;  // 最后节点
} hlTable;

typedef struct _func_huffmanTree
{
    htTree *(*buildTree)(char *instr);
    hlTable *(*buildTable)(htTree *huffmanTree);
    void (*encode)(hlTable *table, char *st, char *);
    void (*decode)(htTree *tree, char *str, char *);
    void (*destroyTree)(htTree *);
    void (*destroyTable)(hlTable *);

} func_huffmanTree;

extern func_huffmanTree fhuffmanTree;

#endif
